package com.example.myletcodelearing.chaintable

/**
 * @author tgw
 * @date 2022/11/7
 * @describe
 */

fun main(array: Array<String>) {
    val circularQueue = MyCircularQueue(3) // 设置长度为 3

    circularQueue.enQueue(1) // 返回 true

    circularQueue.enQueue(2) // 返回 true

    circularQueue.enQueue(3) // 返回 true

    circularQueue.enQueue(4) // 返回 false，队列已满

    circularQueue.Rear() // 返回 3

    circularQueue.isFull() // 返回 true

    circularQueue.deQueue() // 返回 true

    circularQueue.enQueue(4) // 返回 true

    circularQueue.Rear() // 返回 4


}
private class MyCircularQueue(k: Int) {

    /**
     *data ：表示固定的数组，用作循环队列
    head ：表示的队列的头指针
    tail ： 表示队列的尾指针
     */
    var head = -1;
    var tail = -1;
    var data = IntArray(k);
    val size = k;

    fun enQueue(value: Int): Boolean {
        if (isFull()) return false
        if (isEmpty()) head = 0
        tail = (tail + 1) % size
        data[tail] = value
        return true
    }

    fun deQueue(): Boolean {
        if (isEmpty()) return false
        if (head == tail) {
            head = -1
            tail = -1
            return true
        }
        head = (head + 1) % size
        return true
    }

    fun Front(): Int {
        if (isEmpty()) return -1
        return data[head]
    }

    fun Rear(): Int {
        if (isEmpty()) return -1
        return data[tail]
    }

    fun isEmpty(): Boolean {
        return head == -1
    }

    fun isFull(): Boolean {
        return (tail + 1) % size == head
    }

}
